#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：data_reader 
@File ：data_reader_new.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/19 15:40 
"""

# import pandas as pd
#
#
# class DataReader:
# 	def __init__(self, data_source):
# 		self.data_source = data_source
# 		self.plugins = {}
#
# 	def add_plugin(self, name, plugin):
# 		self.plugins[name] = plugin
#
# 	def set_data_reader(self, plugin_name):
# 		if plugin_name not in self.plugins:
# 			raise ValueError(f"插件 {plugin_name} 不存在，请先添加插件。")
# 		self.data_reader = self.plugins[plugin_name]
#
# 	def read_data(self, *args, **kwargs):
# 		if not self.data_reader:
# 			raise ValueError("未设置有效的数据读取方式，请使用set_data_reader方法设置数据读取方式。")
#
# 		return self.data_reader.read_data(self.data_source, *args, **kwargs)
#
#
# class DatabaseReader:
# 	def read_data(self, data_source, table_name):
# 		# 实现数据库读取逻辑，返回数据
# 		# 根据表名从数据库中读取相应数据
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		# 这里返回一个DataFrame作为示例
# 		query = f"SELECT * FROM {table_name}"
# 		return pd.DataFrame({'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']})
#
# 	def read_table_metadata(self, data_source, table_name):
# 		# 实现读取数据库表元数据的逻辑
# 		# 返回表的结构、字段信息等
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		return {'Column1': 'int', 'Column2': 'varchar'}
#
#
# class ExcelReader:
# 	def read_data(self, data_source, sheet_name):
# 		# 实现Excel文件读取逻辑，返回数据
# 		# 根据工作表名从Excel文件中读取相应数据
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		# 这里返回一个DataFrame作为示例
# 		return pd.DataFrame({'Column1': [4, 5, 6], 'Column2': ['D', 'E', 'F']})
#
# 	def read_sheet_names(self, data_source):
# 		# 实现读取Excel文件中工作表名称的逻辑
# 		# 返回所有工作表的名称列表
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		return ['Sheet1', 'Sheet2', 'Sheet3']
#
#
# class CsvReader:
# 	def read_data(self, data_source, delimiter=','):
# 		# 实现CSV文件读取逻辑，返回数据
# 		# 根据分隔符从CSV文件中读取相应数据
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		# 这里返回一个DataFrame作为示例
# 		return pd.DataFrame({'Column1': [7, 8, 9], 'Column2': ['G', 'H', 'I']})
#
# 	def read_header(self, data_source):
# 		# 实现读取CSV文件头部信息的逻辑
# 		# 返回CSV文件的列名列表
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		return ['Column1', 'Column2']
#
#
# class TxtReader:
# 	def read_data(self, data_source, encoding='utf-8'):
# 		# 实现文本文件读取逻辑，返回数据
# 		# 根据编码方式从文本文件中读取相应数据
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		# 这里返回一个DataFrame作为示例
# 		return pd.DataFrame({'Column1': [10, 11, 12], 'Column2': ['J', 'K', 'L']})
#
# 	def read_line_count(self, data_source):
# 		# 实现读取文本文件行数的逻辑
# 		# 返回文本文件的总行数
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		return 3
#
#
# # 扩展新的数据读取方式
# class JsonReader:
# 	def read_data(self, data_source):
# 		# 实现JSON文件读取逻辑，返回数据
# 		# 在这里假设从JSON文件读取数据的具体实现代码
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		# 这里返回一个DataFrame作为示例
# 		return pd.DataFrame({'Column1': [13, 14, 15], 'Column2': ['M', 'N', 'O']})
#
# 	def read_metadata(self, data_source):
# 		# 实现读取JSON文件的元数据的逻辑
# 		# 返回JSON文件的元数据信息
# 		# 这里只是简单示例，您需要根据实际情况进行更改
# 		return {'format': 'json', 'version': '1.0'}
#
#
# # 使用示例
# data_reader = DataReader("my_data.xlsx")
#
# data_reader.add_plugin("database", DatabaseReader())
# data_reader.add_plugin("excel", ExcelReader())
# data_reader.add_plugin("csv", CsvReader())
# data_reader.add_plugin("txt", TxtReader())
# data_reader.add_plugin("json", JsonReader())
#
# # 设置数据读取方式为Excel，并读取数据
# data_reader.set_data_reader("excel")
# data = data_reader.read_data(sheet_name="Sheet1")
# print(data)
#
# # 设置数据读取方式为JSON，并读取数据
# data_reader.set_data_reader("json")
# data = data_reader.read_data()
# print(data)

import pandas as pd
import sqlite3
import openpyxl
import csv
import json
from io import StringIO, TextIOWrapper


class DataReader:
	def __init__(self, data_source):
		self.data_source = data_source
		self.plugins = {}

	def add_plugin(self, name, plugin):
		self.plugins[name] = plugin

	def set_data_reader(self, plugin_name):
		if plugin_name not in self.plugins:
			raise ValueError(f"插件 {plugin_name} 不存在，请先添加插件。")
		self.data_reader = self.plugins[plugin_name]

	def read_data(self, *args, **kwargs):
		if not self.data_reader:
			raise ValueError("未设置有效的数据读取方式，请使用set_data_reader方法设置数据读取方式。")

		return self.data_reader.read_data(self.data_source, *args, **kwargs)


class DatabaseReader:
	def __init__(self, connection_string):
		self.conn = sqlite3.connect(connection_string)

	def read_data(self, table_name):
		query = f"SELECT * FROM {table_name}"
		df = pd.read_sql_query(query, self.conn)
		return df

	def close_connection(self):
		self.conn.close()


class ExcelReader:
	def read_data(self, data_source, sheet_name=0):
		workbook = openpyxl.load_workbook(data_source)
		worksheet = workbook[sheet_name]
		data = [[cell.value for cell in row] for row in worksheet.iter_rows()]
		df = pd.DataFrame(data)
		return df


class CsvReader:
	def read_data(self, data_source, delimiter=','):
		with open(data_source, 'r', newline='', encoding='utf-8') as csvfile:
			reader = csv.reader(csvfile, delimiter=delimiter)
			data = [row for row in reader]
		df = pd.DataFrame(data[1:], columns=data[0])
		return df


class TxtReader:
	def read_data(self, data_source, delimiter='\t', has_header=True):
		if has_header:
			with open(data_source, 'r', encoding='utf-8') as txtfile:
				header = next(txtfile).strip().split(delimiter)
			df = pd.read_csv(data_source, sep=delimiter, header=None, names=header)
		else:
			df = pd.read_csv(data_source, sep=delimiter, header=None)
		return df


class JsonReader:
	def read_data(self, data_source):
		with open(data_source, 'r', encoding='utf-8') as jsonfile:
			data = json.load(jsonfile)
		df = pd.DataFrame(data)
		return df


# 使用示例
data_reader = DataReader("my_data.xlsx")

# 假设我们有一个SQLite数据库连接字符串
database_conn_str = "sqlite:///example.db"
data_reader.add_plugin("database", DatabaseReader(database_conn_str))

data_reader.add_plugin("excel", ExcelReader())
data_reader.add_plugin("csv", CsvReader())
data_reader.add_plugin("txt", TxtReader())
data_reader.add_plugin("json", JsonReader())

# 从Excel文件读取数据
data_reader.set_data_reader("excel")
data_excel = data_reader.read_data(sheet_name="Sheet1")
print(data_excel)

# 从JSON文件读取数据
data_reader.set_data_reader("json")
data_json = data_reader.read_data(data_source="my_data.json")
print(data_json)

# 从数据库表读取数据
data_reader.set_data_reader("database")
data_db = data_reader.read_data(table_name="my_table")
print(data_db)
